﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Planning.Classes;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.xml;
using System.IO;
using System.Reflection;

namespace Planning.Forms {
    public partial class ajoutFormationForm : Form {   
        #region Construct
        bool isAjout;
        int idFormation;
        private planningForm parentForm;

        // Constructeur d'ajout de formation
        public ajoutFormationForm(planningForm parentForm) {
            InitializeComponent();
            // Stocke le parent pour appeler ses fonctions
            this.parentForm = parentForm;
            this.isAjout = true;

            // Selectionne les lieux
            DataTable lieux = SQL.requete("SELECT * FROM LIEU");
            // Lie la ComboBox à la DataTable
            this.CBlieux.DataSource = lieux;
            this.CBlieux.ValueMember = "id_lieu";
            this.CBlieux.DisplayMember = "libelle_lieu";
            // Combo box non modifiable
            this.CBlieux.DropDownStyle = ComboBoxStyle.DropDownList;

            this.isOuverte.Checked = true;
        }

        // Constructeur de modification de formation
        public ajoutFormationForm(int idFormation, planningForm parentForm) {
            InitializeComponent();
            // Stocke l'ID de la formation ouvrte
            this.idFormation = idFormation;
            this.isAjout = false;
            // Stocke le parent pour appeler ses fonctions
            this.parentForm = parentForm;
            // Modifie le nom de la fenêtre, et le nom des  boutons
            this.Text = "Formulaire de modification d'une formation";
            label5.Text = "Date :";
            this.buttonValider.Text = "Modifier";
            this.buttonAnnuler.Text = "Fermer";
            
            // Gestion du bouton de génération de la formation
            this.buttonGenerer.Visible = true;
            this.buttonGenerer.Click += new EventHandler((sender, e) => buttonGenerer_Click(sender, e, idFormation));

            // Selectionne les lieux
            DataTable lieux = SQL.requete("SELECT * FROM LIEU");
            // Lie la ComboBox à la DataTable
            this.CBlieux.DataSource = lieux;
            this.CBlieux.ValueMember = "id_lieu";
            this.CBlieux.DisplayMember = "libelle_lieu";
            // Combo box non modifiable
            this.CBlieux.DropDownStyle = ComboBoxStyle.DropDownList;

            // Selectionne la formation
            DataTable formation = SQL.requete("SELECT * FROM FORMATION WHERE id_formation = " + idFormation + ";");
            // Valorise les informations de la formation
            this.libelleFormationText.Text = formation.Rows[0]["libelle_formation"].ToString().Replace("  ", "");
            this.descrFormationText.Text = formation.Rows[0]["description_formation"].ToString().Replace("  ","");
            this.CBlieux.SelectedValue.Equals(Convert.ToInt32(formation.Rows[0]["id_lieu"].ToString()));
            this.nbPlaces.Value = Convert.ToInt32(formation.Rows[0]["places_formation"].ToString());
            this.isOuverte.Checked = Convert.ToBoolean(formation.Rows[0]["isOuverte"].ToString());
            this.heureDebut.Value = Convert.ToDateTime(formation.Rows[0]["debut_formation"]);
            this.heureFin.Value = Convert.ToDateTime(formation.Rows[0]["fin_formation"]);
            this.date1.Value = Convert.ToDateTime(formation.Rows[0]["debut_formation"]);

            // Masque la possibilité d'ajouter plusieurs fois la formation
            this.date2.Visible = false;
            this.date2CB.Visible = false;
            this.date3.Visible = false;
            this.date3CB.Visible = false;
            this.date4.Visible = false;
            this.date4CB.Visible = false;
            this.date5.Visible = false;
            this.date5CB.Visible = false;

            // Si la formation n'est pas ouverte
            if(!this.isOuverte.Checked) {
                // Vérouille les champs
                this.libelleFormationText.Enabled = false;
                this.descrFormationText.Enabled = false;
                CBlieux.Enabled = false;
                nbPlaces.Enabled = false;
                heureDebut.Enabled = false;
                heureFin.Enabled = false;
                date1.Enabled = false;
            }
        }
        #endregion

        #region CheckBoxes
        // Pour chaque chexbox, affiche la suivante si elle est cochée, et la masque si elle ne l'est pas
        private void date2CB_CheckedChanged(object sender, EventArgs e) {
            if (date2CB.Checked) {
                date2.Enabled = true;
                date2.Value = date1.Value.AddDays(1);
                date3CB.Visible = true;
                date3.Visible = true;
            }
            else {
                date2.Enabled = false;

                date3CB.Visible = false;
                date3CB.Checked = false;
                date3.Visible = false;

                date4CB.Visible = false;
                date4CB.Checked = false;
                date4.Visible = false;

                date5CB.Visible = false;
                date5CB.Checked = false;
                date5.Visible = false;
            }
        }
        private void date3CB_CheckedChanged(object sender, EventArgs e) {
            if (date3CB.Checked) {
                date3.Enabled = true;
                date3.Value = date2.Value.AddDays(1);
                date4CB.Visible = true;
                date4.Visible = true;
            }
            else {
                date3.Enabled = false;

                date4CB.Visible = false;
                date4CB.Checked = false;
                date4.Visible = false;
                
                date5CB.Visible = false;
                date5CB.Checked = false;
                date5.Visible = false;
            }
        }
        private void date4CB_CheckedChanged(object sender, EventArgs e) {
            if (date4CB.Checked) {
                date4.Enabled = true;
                date4.Value = date3.Value.AddDays(1);
                date5CB.Visible = true;
                date5.Visible = true;
            }
            else {
                date4.Enabled = false;
                date5CB.Visible = false;
                date5CB.Checked = false;
                date5.Visible = false;
            }

        }
        private void date5CB_CheckedChanged(object sender, EventArgs e) {
            if (date5CB.Checked) {
                date5.Enabled = true;
                date5.Value = date4.Value.AddDays(1);
            }
            else {
                date5.Enabled = false;
            }
        }
        #endregion

        #region clics
        private void buttonValider_Click(object sender, EventArgs e) {
            // Stocke de la date et l'heure du début et de la fin de la formation
            DateTime debut = new DateTime(Convert.ToInt32(date1.Value.ToString("yyyy")), Convert.ToInt32(date1.Value.ToString("MM")), Convert.ToInt32(date1.Value.ToString("dd")), Convert.ToInt32(heureDebut.Value.ToString("HH")), Convert.ToInt32(heureDebut.Value.ToString("mm")), 0, 0);
            DateTime fin = new DateTime(Convert.ToInt32(date1.Value.ToString("yyyy")), Convert.ToInt32(date1.Value.ToString("MM")), Convert.ToInt32(date1.Value.ToString("dd")), Convert.ToInt32(heureFin.Value.ToString("HH")), Convert.ToInt32(heureFin.Value.ToString("mm")), 0, 0);
            int idAssociation = Convert.ToInt32(this.parentForm.infoConnexion["id_association"]);
            // S'il s'agit d'un ajout
            if (this.isAjout) {
                if (date2CB.Checked) {
                    // Ajoute la 1ere formation, à l'aide de la fonction
                    if (SQL.ajoutFormation(Convert.ToInt32(this.CBlieux.SelectedValue.ToString()), idAssociation, this.libelleFormationText.Text.ToString(), this.descrFormationText.Text.ToString(), Convert.ToInt32(this.nbPlaces.Value), debut, fin, this.isOuverte.Checked)) {
                        // Si la fonction retourne vrai, elle est ajoutée
                        MessageBox.Show("Première formation ajoutée.");
                    }
                    else {
                        // Si la fonction retourne faux, une erreur s'est produite lors de l'ajout de la formation
                        MessageBox.Show("Erreur lors de l'ajout de la première formation.");
                    }
                    
                    // Stocke la date et l'heure du début et de la fin de la 2eme formation
                    debut = new DateTime(Convert.ToInt32(date2.Value.ToString("yyyy")), Convert.ToInt32(date2.Value.ToString("MM")), Convert.ToInt32(date2.Value.ToString("dd")), Convert.ToInt32(heureDebut.Value.ToString("HH")), Convert.ToInt32(heureDebut.Value.ToString("mm")), 0, 0);
                    fin = new DateTime(Convert.ToInt32(date2.Value.ToString("yyyy")), Convert.ToInt32(date2.Value.ToString("MM")), Convert.ToInt32(date2.Value.ToString("dd")), Convert.ToInt32(heureFin.Value.ToString("HH")), Convert.ToInt32(heureFin.Value.ToString("mm")), 0, 0);
                    // Ajoute la 2eme formation à l'aide de la fonction
                    if (SQL.ajoutFormation(Convert.ToInt32(this.CBlieux.SelectedValue.ToString()), idAssociation, this.libelleFormationText.Text.ToString(), this.descrFormationText.Text.ToString(), Convert.ToInt32(this.nbPlaces.Value), debut, fin, this.isOuverte.Checked)) {
                        // Si la fonction retourne vrai, elle est ajoutée
                        MessageBox.Show("Seconde formation ajoutée.");
                    }
                    else {
                        // Si la fonction retourne faux, une erreur s'est produite lors de l'ajout de la formation
                        MessageBox.Show("Erreur lors de l'ajout de la seconde formation.");
                    }
                    if (date3CB.Checked) {
                        // Stocke la date et l'heure du début et de la fin de la 3eme formation
                        debut = new DateTime(Convert.ToInt32(date3.Value.ToString("yyyy")), Convert.ToInt32(date3.Value.ToString("MM")), Convert.ToInt32(date3.Value.ToString("dd")), Convert.ToInt32(heureDebut.Value.ToString("HH")), Convert.ToInt32(heureDebut.Value.ToString("mm")), 0, 0);
                        fin = new DateTime(Convert.ToInt32(date3.Value.ToString("yyyy")), Convert.ToInt32(date3.Value.ToString("MM")), Convert.ToInt32(date3.Value.ToString("dd")), Convert.ToInt32(heureFin.Value.ToString("HH")), Convert.ToInt32(heureFin.Value.ToString("mm")), 0, 0);
                        // Ajoute la 3eme formation à l'aide de la fonction
                        if (SQL.ajoutFormation(Convert.ToInt32(this.CBlieux.SelectedValue.ToString()), idAssociation, this.libelleFormationText.Text.ToString(), this.descrFormationText.Text.ToString(), Convert.ToInt32(this.nbPlaces.Value), debut, fin, this.isOuverte.Checked)) {
                            // Si la fonction retourne vrai, elle est ajoutée
                            MessageBox.Show("Troisième formation ajoutée.");
                        }
                        else {
                            // Si la fonction retourne faux, une erreur s'est produite lors de l'ajout de la formation
                            MessageBox.Show("Erreur lors de l'ajout de la troisième formation.");
                        }
                        if (date4CB.Checked) {
                            // Stocke la date et l'heure du début et de la fin de la 4eme formation
                            debut = new DateTime(Convert.ToInt32(date4.Value.ToString("yyyy")), Convert.ToInt32(date4.Value.ToString("MM")), Convert.ToInt32(date4.Value.ToString("dd")), Convert.ToInt32(heureDebut.Value.ToString("HH")), Convert.ToInt32(heureDebut.Value.ToString("mm")), 0, 0);
                            fin = new DateTime(Convert.ToInt32(date4.Value.ToString("yyyy")), Convert.ToInt32(date4.Value.ToString("MM")), Convert.ToInt32(date4.Value.ToString("dd")), Convert.ToInt32(heureFin.Value.ToString("HH")), Convert.ToInt32(heureFin.Value.ToString("mm")), 0, 0);
                            // Ajoute la seconde formation à l'aide de la fonction
                            if (SQL.ajoutFormation(Convert.ToInt32(this.CBlieux.SelectedValue.ToString()), idAssociation, this.libelleFormationText.Text.ToString(), this.descrFormationText.Text.ToString(), Convert.ToInt32(this.nbPlaces.Value), debut, fin, this.isOuverte.Checked)) {
                                // Si la fonction retourne vrai, elle est ajoutée
                                MessageBox.Show("Quatrième formation ajoutée.");
                            }
                            else
                            {
                                // Si la fonction retourne faux, une erreur s'est produite lors de l'ajout de la formation
                                MessageBox.Show("Erreur lors de l'ajout de la quatrième formation.");
                            }
                            if (date5CB.Checked) {
                                // Stocke la date et l'heure du début et de la fin de la 5eme formation
                                debut = new DateTime(Convert.ToInt32(date5.Value.ToString("yyyy")), Convert.ToInt32(date5.Value.ToString("MM")), Convert.ToInt32(date5.Value.ToString("dd")), Convert.ToInt32(heureDebut.Value.ToString("HH")), Convert.ToInt32(heureDebut.Value.ToString("mm")), 0, 0);
                                fin = new DateTime(Convert.ToInt32(date5.Value.ToString("yyyy")), Convert.ToInt32(date5.Value.ToString("MM")), Convert.ToInt32(date5.Value.ToString("dd")), Convert.ToInt32(heureFin.Value.ToString("HH")), Convert.ToInt32(heureFin.Value.ToString("mm")), 0, 0);
                                // Ajoute la 5eme formation à l'aide de la fonction
                                if (SQL.ajoutFormation(Convert.ToInt32(this.CBlieux.SelectedValue.ToString()), idAssociation, this.libelleFormationText.Text.ToString(), this.descrFormationText.Text.ToString(), Convert.ToInt32(this.nbPlaces.Value), debut, fin, this.isOuverte.Checked)) {
                                    // Si la fonction retourne vrai, elle est ajoutée
                                    MessageBox.Show("Cinquième formation ajoutée.");
                                }
                                else
                                {
                                    // Si la fonction retourne faux, une erreur s'est produite lors de l'ajout de la formation
                                    MessageBox.Show("Erreur lors de l'ajout de la cinquième formation.");
                                }
                            }
                        }
                    }
                }
                else {
                    // Ajoute la formation, à l'aide de la fonction
                    if (SQL.ajoutFormation(Convert.ToInt32(this.CBlieux.SelectedValue.ToString()), idAssociation, this.libelleFormationText.Text.ToString(), this.descrFormationText.Text.ToString(), Convert.ToInt32(this.nbPlaces.Value), debut, fin, this.isOuverte.Checked)) {
                        // Si la fonction retourne vrai, elle est ajoutée
                        MessageBox.Show("Formation ajoutée.");
                    }
                    else {
                        // Si la fonction retourne faux, une erreur s'est produite lors de l'ajout de la formation
                        MessageBox.Show("Erreur lors de l'ajout de la formation.");
                    }
                }
                    
            }
            // S'il s'agit d'une modification
            else {
                // Modifie la formation à l'aide de la fonction
                if (SQL.modifFormation(this.idFormation ,Convert.ToInt32(this.CBlieux.SelectedValue.ToString()), this.libelleFormationText.Text.ToString(), this.descrFormationText.Text.ToString(), Convert.ToInt32(this.nbPlaces.Value), debut, fin, this.isOuverte.Checked))
                    // Si la fonction retourne vrai, elle est modifiée
                    MessageBox.Show("Formation Modifiée.");
                else
                    // Si la fonction retourne faux, une erreur s'est produite lors de la modification
                    MessageBox.Show("Erreur lors de la modification de la formation.");
            }

            // Vide le calendrier
            this.parentForm.cleanCalendar();
            // Regénère le calendrier
            this.parentForm.generateCalendar(this.parentForm.nbJours, this.parentForm.firstDay, this.parentForm.currentDate); ;
            // Ferme la fenêtre
            this.Dispose();
        }

        private void buttonAnnuler_Click(object sender, EventArgs e) {
            // Ferme la fenêtre
            this.Dispose();
        }

        private void buttonGenerer_Click(object sender, EventArgs e, int idFormation) {
            // Ouvre le PDF dans les ressources
            PdfReader pdfReader = new PdfReader(Properties.Resources.formationsTemplate);

            // Ouvre une fenêtre d'enregistrement
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            // Nom par defaut du ficher
            saveFileDialog1.FileName = "Formation " + idFormation.ToString() + ".pdf";
            // Type de fichier
            saveFileDialog1.Filter = "Fichier PDF (*.pdf)|*.pdf";
            // Ouvre le dernier dossier sauvegardé
            saveFileDialog1.RestoreDirectory = true;
            
            // Lors de la validation
            if (saveFileDialog1.ShowDialog() == DialogResult.OK) {
                // Créé le PDF dans l'emplacement de la fenêtre d'enregistrement
                PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(saveFileDialog1.FileName, FileMode.Create));
                // Récupère les champs
                AcroFields pdfFormFields = pdfStamper.AcroFields;
                // Recupère les informations de l'association
                DataTable assoc = SQL.requete("SELECT nom_association, icom, nom_adherent, prenom_adherent, mail_adherent, tel_adherent, fax_adherent " +
                    "FROM ASSOCIATION " +
                    "INNER JOIN CONTACT_ASSOCIATION ON ASSOCIATION.id_association = CONTACT_ASSOCIATION.id_association " +
                    "LEFT JOIN ADHERENT ON CONTACT_ASSOCIATION.id_adherent = ADHERENT.id_adherent " +
                    "WHERE ASSOCIATION.id_association = " + this.parentForm.infoConnexion["id_association"].ToString() + ";");

                // Remplis les champs
                pdfFormFields.SetField("association", assoc.Rows[0]["nom_association"].ToString());
                pdfFormFields.SetField("icom1", assoc.Rows[0]["icom"].ToString().Substring(0, 2));
                pdfFormFields.SetField("icom2", assoc.Rows[0]["icom"].ToString().Substring(2, 2));
                pdfFormFields.SetField("icom3", assoc.Rows[0]["icom"].ToString().Substring(4, 2));
                pdfFormFields.SetField("icom4", assoc.Rows[0]["icom"].ToString().Substring(6, 2));
                pdfFormFields.SetField("icom5", assoc.Rows[0]["icom"].ToString().Substring(8, 2));
                pdfFormFields.SetField("icom6", assoc.Rows[0]["icom"].ToString().Substring(10, 2));
                pdfFormFields.SetField("icom7", assoc.Rows[0]["icom"].ToString().Substring(12, 2));
                pdfFormFields.SetField("icom8", assoc.Rows[0]["icom"].ToString().Substring(14, 2));
                pdfFormFields.SetField("np", assoc.Rows[0]["nom_adherent"].ToString().Replace("  ", "") + " " + assoc.Rows[0]["prenom_adherent"].ToString().Replace("  ", ""));
                pdfFormFields.SetField("mail", assoc.Rows[0]["mail_adherent"].ToString());
                pdfFormFields.SetField("tel", assoc.Rows[0]["tel_adherent"].ToString());
                pdfFormFields.SetField("fax", assoc.Rows[0]["fax_adherent"].ToString());
                // Désactive la modifcation
                pdfStamper.FormFlattening = true;
                // Ferme le PDF
                pdfStamper.Close();
                // Ferme l'inscription à la formation
                if (!SQL.nonQuery("UPDATE FORMATION SET isOuverte = 0;")) {
                    MessageBox.Show("Erreur lors de la cloture de la formation.");
                }
                // Ouvre la fenêtre de génération
                generationFormationForm form = new generationFormationForm(idFormation);
                form.Show();
                // Ferme la fenêtre
                this.Dispose();
            }
        }
        #endregion

        private void isOuverte_CheckStateChanged(object sender, EventArgs e) {
            // Pour chaque changement d'état de la checkbox "formation ouverte"

            // Si la formation est ouverte
            if (this.isOuverte.Checked) {
                // Active les champs
                this.libelleFormationText.Enabled = true;
                this.descrFormationText.Enabled = true;
                CBlieux.Enabled = true;
                nbPlaces.Enabled = true;
                heureDebut.Enabled = true;
                heureFin.Enabled = true;
                date1.Enabled = true;
            }
            // Si la formation est fermée
            else {
                // Desactive les champs
                this.libelleFormationText.Enabled = false;
                this.descrFormationText.Enabled = false;
                CBlieux.Enabled = false;
                nbPlaces.Enabled = false;
                heureDebut.Enabled = false;
                heureFin.Enabled = false;
                date1.Enabled = false;            
            }
        }
    }
}
